const path = require('path');

// 使用动态导入避免在没有安装依赖时出错
let nodeExternals, CopyWebpackPlugin;

try {
  nodeExternals = require('webpack-node-externals');
} catch (e) {
  console.warn('webpack-node-externals 未安装，将使用内置外部依赖处理');
  nodeExternals = null;
}

try {
  CopyWebpackPlugin = require('copy-webpack-plugin');
} catch (e) {
  console.warn('copy-webpack-plugin 未安装，将跳过文件复制');
  CopyWebpackPlugin = null;
}

module.exports = (env, argv) => {
  const isProduction = argv.mode === 'production';

  return {
    // 目标环境：Node.js
    target: 'node',

    // 入口文件
    entry: {
      server: './app.js'
    },

    // 输出配置
    output: {
      path: path.resolve(__dirname, 'dist'),
      filename: 'server.js',
      clean: true, // 清理输出目录
      library: {
        type: 'commonjs2'
      }
    },

    // 打包所有依赖（包括node_modules）
    externals: [],

    // 模块解析
    resolve: {
      extensions: ['.js', '.json'],
      alias: {
        '@': path.resolve(__dirname, './'),
        '~': path.resolve(__dirname, './')
      }
    },

    // 模块规则
    module: {
      rules: [
        {
          test: /\.js$/,
          exclude: /node_modules/,
          use: {
            loader: 'babel-loader',
            options: {
              presets: [
                [
                  '@babel/preset-env',
                  {
                    targets: {
                      node: 'current'
                    }
                  }
                ]
              ],
              plugins: []
            }
          }
        }
      ]
    },

    // 插件
    plugins: CopyWebpackPlugin ? [
      // 复制静态文件和必要文件
      new CopyWebpackPlugin({
        patterns: [
          {
            from: 'config.js',
            to: 'config.js'
          },
          // 复制数据文件夹（如果需要）
          {
            from: 'fenbi',
            to: 'fenbi',
            noErrorOnMissing: true
          }
        ]
      })
    ] : [],

    // 优化配置
    optimization: {
      splitChunks: false, // 禁用代码分割，保持单个文件
      minimize: isProduction // 仅在生产环境压缩
    },

    // 开发工具
    devtool: isProduction ? 'source-map' : 'eval-source-map',

    // 统计信息
    stats: {
      colors: true,
      errorDetails: true
    },

    // 性能提示
    performance: {
      hints: false // 禁用性能提示
    }
  };
};
